package cn.kgc.websocket;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.concurrent.GlobalEventExecutor;

/**
 * @author wangyue
 * @version 1.0
 */
public class ChatHandler_old extends SimpleChannelInboundHandler<TextWebSocketFrame> {

    /**
     * 创建一个ChannelGroup,用于保存所有连接的channel
     */
    public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    /**
     * 读取数据 - 处理客户端发送的消息
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        // 获取客户端发送的消息
        String content = msg.text();
        // 获取当前通道
        Channel channel = ctx.channel();
        // 获取当前用户标识
        String userId = channel.id().asShortText(); // 使用短ID更简洁

        // 遍历所有连接，向其他用户转发消息
        for (Channel ch : channelGroup) {
            if (ch == channel) {
                // 发送给自己的消息
                ch.writeAndFlush(new TextWebSocketFrame("我: " + content));
            } else {
                // 发送给其他人的消息
                ch.writeAndFlush(new TextWebSocketFrame(userId + ": " + content));
            }
        }
    }

    /**
     * 当有新的客户端连接时,将连接的channel保存到channelGroup中
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        //获得当前客户端与服务端的通道的短ID，更简洁
        String shortText = ctx.channel().id().asShortText();
        //将连接的channel保存到channelGroup中
        channelGroup.add(ctx.channel());
        // 通知所有用户有新用户加入
        channelGroup.writeAndFlush(new TextWebSocketFrame("系统消息: 用户" + shortText + "加入聊天室"));
    }

    /**
     * 当有客户端断开连接时,将断开连接的channel从channelGroup中移除
     */
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        //获得当前客户端与服务端的通道的短ID
        String shortText = ctx.channel().id().asShortText();
        //channelGroup会自动移除断开连接的channel，这行可以省略
        //channelGroup.remove(ctx.channel());
        // 通知所有用户有用户离开
        channelGroup.writeAndFlush(new TextWebSocketFrame("系统消息: 用户" + shortText + "离开了聊天室"));
    }

    /**
     * 发生异常时,关闭连接
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //打印异常信息
        cause.printStackTrace();
        //获得当前客户端与服务端的通道的短ID
        String shortText = ctx.channel().id().asShortText();
        //关闭连接
        ctx.close();
        // 通知所有用户有用户异常离开
        channelGroup.writeAndFlush(new TextWebSocketFrame("系统消息: 用户" + shortText + "异常断开连接"));
    }
}